﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Data;
using System.Windows.Documents;
using System.Windows.Input;
using System.Windows.Media;
using System.Windows.Media.Imaging;
using System.Windows.Navigation;
using System.Windows.Shapes;
using ExamSharedClasses.Commands;
using ExamSharedClasses;
using ExamClient;

namespace ExamClient {
    /// <summary>
    /// (k) Die MainPage erlaubt dem Teilnehmer aus einer Liste von Klausuren eine
    /// zum Anzeigen oder Schreiben auszuwählen - je nach Status. (geschrieben oder nicht)
    /// Die Aktion wird dann mit einem Doppelklick auf das Listenelement gestartet. Die
    /// Liste enthält je nach Serveranfrage entweder die einen, die anderen oder beide.
    /// </summary>
    public partial class MainPage : Page {
        public bool ShowPastExams { get; set; }

        public MainPage( bool showPastExams )  {
            InitializeComponent();
            App.MainPage = this;
            this.ShowPastExams = showPastExams;
            PageUpdate();
        }
        public MainPage() : this( false ) { }

        /// <summary>
        /// Je nach Usergruppenangehörigkeit
        /// -dem Admin alle User und deren Status auflisten
        /// -dem Dozenten seine Klasse und alle relevanten Klausuren
        /// -dem Teilnehmer entweder alle oder alle noch zu schreibenden Klausuren anzeigen
        /// </summary>
        public void PageUpdate() {

            futureExamsListBox.Items.Clear();
            if ( App.UserAddress.UserGroup.GroupId == 4 ) {
                futureExamsListBox.Items.Add( "Benutzer werden abgerufen... " );
                label1.Content = "Alle Benutzer";
            } else if ( App.UserAddress.UserGroup.GroupId == 2 ) {
                futureExamsListBox.Items.Add( "Klausuren und Benutzer werden abgerufen... " );
                label1.Content = "Klausuren und Benutzer";
                App.ServerConnection.Send( new ViewExams() );
            } else {
                futureExamsListBox.Items.Add( "...Klausuren werden abgerufen... " );
                if ( ShowPastExams )
                    label1.Content = "Klausurenübersicht";
                else
                    label1.Content = "Zukünftige Klausuren";
                App.ServerConnection.Send( new ViewExams() );
            }

        }

        /// <summary>
        /// Hier werden alle User in die universelle Listbox eingetragen.
        /// Die anderen Einträge werden zwischengespeichert, die nicht
        /// im Zusammenhang mit der Userklasse stehen.
        /// </summary>
        /// <param name="vc"></param>
        public void AddReceivedUsers( ViewClass vc ) {
            List<object> tempList = new List<object>();
            foreach ( object o in futureExamsListBox.Items ) {
                tempList.Add( o );
            }

            App.MainPage.futureExamsListBox.Items.Clear();
            int iMax = vc.ClassWithUsers.UserList.Count;
            for ( int i = 0; i < iMax; i++ ) {
                if ( vc.ClassWithUsers.UserList[i].UserId == App.UserAddress.UserId )
                    continue;
                string text = vc.ClassWithUsers.UserList[i].ToShortInformationString();
                if ( vc.IsUserLoggedIn[i] ) {
                    text += "; angemeldet";
                    if ( vc.IsUserWriting[i] ) {
                        text += "; schreibend";
                    }
                }
                futureExamsListBox.Items.Add( text );
            }
            futureExamsListBox.Items.Add( "" );
            futureExamsListBox.Items.Add( "" );
            foreach ( object o in tempList ) {
                if ( !( o is User ) && !( o is string ) )
                    futureExamsListBox.Items.Add( o );
            }

        }
        public void AddReceivedUsers( ViewUsers vu ) {
            List<object> tempList = new List<object>();
            foreach ( object o in futureExamsListBox.Items ) {
                tempList.Add( o );
            }

            App.MainPage.futureExamsListBox.Items.Clear();
            int iMax = vu.LoggedInUserList.Count;
            for ( int i = 0; i < iMax; i++ ) {
                if ( vu.LoggedInUserList[i].UserId == App.UserAddress.UserId )
                    continue;
                string text = vu.LoggedInUserList[i].ToShortInformationString() + "; angemeldet" ;
                if ( vu.IsUserWriting[i] ) {
                    text += "; schreibend";
                }
                futureExamsListBox.Items.Add( text );
            }
            futureExamsListBox.Items.Add( "" );
            futureExamsListBox.Items.Add( "" );
            foreach ( object o in tempList ) {
                if ( !( o is User ) && !( o is string ) )
                    futureExamsListBox.Items.Add( o );
            }

        }

        public void AddReceivedExams( ViewExams ve ) {
            List<object> tempList = new List<object>();
            foreach ( object o in futureExamsListBox.Items ) {
                tempList.Add( o );
            }
            futureExamsListBox.Items.Clear();
            foreach ( Exam e in ve.ExamList ) {
                if ( ( e is ExamUser && ShowPastExams ) ) {
                    futureExamsListBox.Items.Add( e );
                } else if ( e is ExamUser ) {
                    ;
                } else if (e is ExamWithQuestions ) {
                    futureExamsListBox.Items.Add( e );
                }
            }
            foreach ( object o in tempList ) {
                if (!(o is Exam) && !(o is string))
                    futureExamsListBox.Items.Add( o );
            }
        }

        private void futureExamsListBox_MouseDoubleClick( object sender, System.Windows.Input.MouseButtonEventArgs e ) {
            if (futureExamsListBox.SelectedValue is Exam) {
                App.Display(futureExamsListBox.SelectedValue);
                ViewExam cve = new ViewExam(new ExamUser(App.UserAddress, new ExamWithQuestions((Exam)futureExamsListBox.SelectedValue)));
                App.ServerConnection.Send( cve );
            }
        }

        private void updateButton_Click( object sender, RoutedEventArgs e ) {
            App.ServerConnection.Send(new ViewExams());
        }
    }
}
